package com.xinggq.auth.service.service;

import com.xinggq.auth.api.dto.login.AuthSafeUserInfoDTO;
import com.xinggq.user.api.dto.UserInfoDTO;
import java.util.Date;

/**
 * @Description
 * @Author xinggq
 * @Date 2025/10/23
 */
public interface TokenManagerService {

  /**
   * 生成访问令牌
   * @param userInfo
   * @param rememberMe
   * @return
   */
  String generateAccessToken(UserInfoDTO userInfo, boolean rememberMe);

  /**
   * 生成刷新令牌
   * @param userInfo
   * @return
   */
  String generateRefreshToken(UserInfoDTO userInfo);

  /**
   * 验证访问令牌并获取用户信息
   * @param token
   * @return
   */
  AuthSafeUserInfoDTO validateTokenAndGetUserInfo(String token);


  /**
   * 验证刷新令牌并获取用户ID
   * @param refreshToken
   * @return
   */
  Long validateRefreshToken(String refreshToken);

  /**
   * 撤销访问令牌
   * @param token
   */
  void revokeToken(String token);

  /**
   * 撤销刷新令牌
   * @param refreshToken
   */
  void revokeRefreshToken(String refreshToken);

  /**
   * 获取访问令牌过期时间
   * @param token
   * @return
   */
  Date getExpirationDateFromToken(String token);

  /**
   * 获取访问令牌有效期（秒）
   * @return
   */
  long getAccessTokenValidity();

  /**
   * 检查用户是否已有活跃会话
   * @param userId 用户ID
   * @return 是否有活跃会话
   */
  boolean hasActiveSession(Long userId);

  /**
   * 获取用户当前活跃会话数量
   * @param userId 用户ID
   * @return 活跃会话数量
   */
  int getActiveSessionCount(Long userId);

  /**
   * 处理用户会话管理
   * 根据配置的会话管理策略处理重复登录
   * @param userId 用户ID
   * @param newToken 新生成的Token
   * @return 是否允许登录
   */
  boolean handleUserSession(Long userId, String newToken);

  /**
   * 撤销用户的所有会话
   * @param userId 用户ID
   */
  void revokeAllUserSessions(Long userId);

  /**
   * 撤销用户的旧会话（保留最新的N个）
   * @param userId 用户ID
   * @param keepCount 保留的会话数量
   */
  void revokeOldUserSessions(Long userId, int keepCount);
}
